using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace mdk
{
   
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        KeyboardState teclado_atual, teclado_anterior;
        MouseState mouse_atual, mouse_anterior;
        GamePadState joystick_atual, joystick_anterior;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            graphics.PreferredBackBufferWidth = 700;
            graphics.PreferredBackBufferHeight = 525;
            graphics.ApplyChanges();

            Gerenciador.current_skill = Gerenciador.Skill.NORMAL;

            
            base.Initialize();

        }

        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
           
            Gerenciador.cena_atual = Gerenciador.Cena.MENU;            

            Gerenciador.intro = new Cenas.Intro();
            Gerenciador.menu = new Cenas.Menu(this.Content);
            Gerenciador.credits = new Cenas.Credits(this.Content);
            Gerenciador.fase_1 = new Cenas.Fase_1(this.Content, this.GraphicsDevice);
            Gerenciador.options_menu = new Cenas.OptionsMenu(this.Content);
            Gerenciador.keyboard = new Cenas.KeyboardControllers(this.Content);

        }

       
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }
     
        protected override void Update(GameTime gameTime)
        {
            teclado_atual = Keyboard.GetState();
            if (teclado_atual.IsKeyDown(Keys.Escape) || Gerenciador.cena_atual == Gerenciador.Cena.EXIT_GAME)
                this.Exit();                 

            switch (Gerenciador.cena_atual)
            {
                case Gerenciador.Cena.CREDITS:
                    Gerenciador.credits.update(gameTime, teclado_atual, teclado_anterior);
                    break;
                case Gerenciador.Cena.MENU:
                    Gerenciador.menu.Update(gameTime);
                    break;
                case Gerenciador.Cena.OPTIONS:
                    Gerenciador.options_menu.Update(gameTime, graphics);
                    break;
                case Gerenciador.Cena.FASE_1:
                    Gerenciador.fase_1.Update(gameTime);
                    break;
                case Gerenciador.Cena.KEYBOARD:
                    Gerenciador.keyboard.update(gameTime, teclado_atual, teclado_anterior);
                    break;
            }
            teclado_anterior = teclado_atual;
            base.Update(gameTime);
        }

      
        protected override void Draw(GameTime gameTime)
        {

            GraphicsDevice.Clear(Color.Black);            

            spriteBatch.Begin();
            
            switch (Gerenciador.cena_atual)
            {
                case Gerenciador.Cena.CREDITS:
                    Gerenciador.credits.draw(gameTime, spriteBatch);
                    break;
                case Gerenciador.Cena.MENU:
                    Gerenciador.menu.Draw(gameTime, spriteBatch);
                    break;
                case Gerenciador.Cena.OPTIONS:
                    Gerenciador.options_menu.Draw(gameTime, spriteBatch);
                    break;
                case Gerenciador.Cena.FASE_1:
                    Gerenciador.fase_1.Draw(gameTime, spriteBatch);
                    break;
                case Gerenciador.Cena.KEYBOARD:
                    Gerenciador.keyboard.draw(gameTime, spriteBatch);
                    break;
            }        
             
            spriteBatch.End();

            base.Draw(gameTime);
        }
       
    }
}
